2
今天开发项目时,遇到一个需求,需要上传一个excel文件到微服务上,微服务是国外同事写的,
我负责处理gateway和前端部分。在postman上测试接口没有问题了,就准备在代码就实现。
但是遇到了一个问题,无论怎样都调用不成功。此时前端到gateway的调用是成功的,因为我可以把controller
拿到的数据成功写入到本地。问题就出在gateway调用另一个微服务上。
@RequestMapping(value = "/import/excel", method = RequestMethod.POST)
    public Object importTableExcel(@RequestParam("file") MultipartFile file, @RequestParam("tableName") String tableName, @RequestParam("importType") String importType) {
        return ep2LookUpDBFeignClient.importTableExcel(file, tableName, importType);
    }
这个是controller代码,前端用formData封装提交,这里用MultipartFile 接收。到这一步是没有问题的
@RequestMapping(value = "/api/tables/import/excel",
        method = RequestMethod.POST,
        produces = { MediaType.APPLICATION_JSON_UTF8_VALUE },
        consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    Object importTableExcel(@RequestParam("file") MultipartFile file,@RequestParam("tableName")String tableName, @RequestParam("importType")String importType);
这个是调用微服务的代码,问题就出在这里。但是我一开始也是百思不得其解,参数设置什么的都没
有问题了,那怎么还会出错了。于是我各种找资料,然后在一篇文中,看到原来是注解写错了,
MultipartFile 的注解应该是@RequestPart,而不是@RequestParam。改了之后果然可以了。
@RequestMapping(value = "/api/tables/import/excel",
        method = RequestMethod.POST,
        produces = { MediaType.APPLICATION_JSON_UTF8_VALUE },
        consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    Object importTableExcel(@RequestPart("file") MultipartFile file,@RequestParam("tableName")String tableName, @RequestParam("importType")String importType);
这个是可以成功运行的代码,在此记录一下,以免下次还犯同样的错误。

以下是 @RequestParam和@RequestPart的区别

1.@RequestPart这个注解用在multipart/form-data表单提交请求的方法上。 
2.支持的请求方法的方式MultipartFile,属于Spring的MultipartResolver类。这个请求是通过                http协议传输的。 
3.@RequestParam也同样支持multipart/form-data请求。 
4.他们最大的不同是,当请求方法的请求参数类型不再是String类型的时候。 
5.@RequestParam适用于name-valueString类型的请求域,@RequestPart适用于复杂的请求域(像JSON,XML)。


呆小婷婷
15 声望0 粉丝